/*
 * @(#)ComponentTest.java	0.0.1-SNAPSHOT
 *
 * Copyright 2009 Telefónica I+D.
 */
package edu.upf.gc.calculator.test;


import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;

/**
 * This class test the calculator interface
 * @version    0.0.1-SNAPSHOT
 * @author     ${developer.name}
 */

final public class Component {
	private edu.upf.gc.calculator.Component component = null;
	/**
	* This method initializes the component. It assign the implementation component 
	* If the implementation component doesn't exist. It must be create a Mock Object  
	*/
	@Before
	public void testStart() {
	    	//If the implementation doesn't exist. We will use a mock object
	        //component = (edu.upf.gc.calculator.Component)edu.upf.gc.calculator.test.mock.Component.getInstance();
	        // else
	        component = new edu.upf.gc.calculator.impl.Component();
	}
	
	/**
	 * This method get the necessary resources
	 */
	@BeforeClass
	public static void BeforeClass() {
		// Para este ejemplo no hacemos nada, pero exponemos el método por
		// motivos didácticos exclusivamente
	}
	
	/**
	 * This method return the resources used by @BeforeClass method
	 */
	@AfterClass
	public static void afterClass() {
		// Para este ejemplo no hacemos nada, pero exponemos el método por
		// motivos didácticos exclusivamente
	}

	/**
	 * This method is runned in each test AFTER to invoke each test
	 */
	@After
	public void testEnd() {
		// Para este ejemplo no hacemos nada, pero exponemos el método por
		// motivos didacticos exclusivamente
	}
	/**
	 * Test the <code>add</code> operation
	 */
	@Test
	public void testAdd() {
		assertEquals((double)4, component.add((double)2,(double)2),0);
		assertEquals((double)5, component.add((double)3,(double)2),0);
	}

        	/**
	 * Test the <code>add</code> operation with a negative operand
	 */
	@Test(expected=IllegalArgumentException.class)
	public void testAddNegativeFirstOperand() {
		component.add((double)-1,(double)2);
	}

	/**
	 * Test the <code>add</code> operation with a negative operand
	 */
	@Test(expected=IllegalArgumentException.class)
	public void testAddNegativeSecondOperand() {
		component.add((double)1,(double)-2);
	}

	/**
	 * Test the <code>add</code> operation with a negative operand
	 */
	@Test(expected=IllegalArgumentException.class)
	public void testAddNegativeFirstAndSecondOperand() {
		component.add((double)-1,(double)-2);
	}


	@Ignore("Este test no se hace, se expone como ejemplo")
	@Test
	public void ignore() {
		// Código que compone la prueba
		// ...
		// ...
	       assertEquals(4, component.add((double)2,(double)2),0);
	}


}